import { EnumOption } from "../RendererOptions";
import { allUpperWordStyle, firstUpperWordStyle, originalWord, allLowerWordStyle } from "./Strings";

export const acronyms: string[] = [
    "aaa",
    "aabb",
    "aac",
    "aal",
    "aalc",
    "aarp",
    "abac",
    "abcl",
    "abi",
    "abm",
    "abr",
    "ac",
    "acd",
    "ack",
    "acl",
    "acm",
    "acme",
    "acp",
    "acpi",
    "acr",
    "adb",
    "adc",
    "adccp",
    "ado",
    "adsl",
    "adt",
    "ae",
    "aes",
    "af",
    "afp",
    "agp",
    "ai",
    "aix",
    "alac",
    "algol",
    "alsa",
    "alu",
    "amd",
    "amoled",
    "amqp",
    "amr",
    "ann",
    "ansi",
    "aop",
    "apci",
    "api",
    "apic",
    "apipa",
    "apl",
    "apr",
    "arin",
    "aros",
    "arp",
    "arpa",
    "arpanet",
    "ascii",
    "aset",
    "asg",
    "asic",
    "asimo",
    "aslr",
    "asm",
    "asmp",
    "asp",
    "asr",
    "assp",
    "ast",
    "ata",
    "atag",
    "atapi",
    "atm",
    "av",
    "avc",
    "avi",
    "awfl",
    "awk",
    "awt",
    "bal",
    "bam",
    "bbp",
    "bbs",
    "bcd",
    "bcnf",
    "beep",
    "ber",
    "bfd",
    "bfs",
    "bft",
    "bgp",
    "bi",
    "binac",
    "bios",
    "bjt",
    "bmp",
    "bnc",
    "boinc",
    "bom",
    "bootp",
    "bpdu",
    "bpel",
    "bpl",
    "bpm",
    "brm",
    "brms",
    "brr",
    "brs",
    "bsa",
    "bsb",
    "bsd",
    "bss",
    "bt",
    "bw",
    "byod",
    "ca",
    "cad",
    "cae",
    "cai",
    "caid",
    "captcha",
    "caq",
    "cd",
    "cde",
    "cdfs",
    "cdma",
    "cdn",
    "cdp",
    "cdsa",
    "cert",
    "ces",
    "cf",
    "cfd",
    "cfg",
    "cg",
    "cga",
    "cgi",
    "cgt",
    "chs",
    "cidr",
    "cifs",
    "cim",
    "cio",
    "cir",
    "cisc",
    "cjk",
    "cjkv",
    "cli",
    "clr",
    "cm",
    "cmdb",
    "cmmi",
    "cmo",
    "cmos",
    "cms",
    "cn",
    "cnc",
    "cng",
    "cnr",
    "cobol",
    "com",
    "corba",
    "cots",
    "cpa",
    "cpan",
    "cpri",
    "cps",
    "cpu",
    "cr",
    "cran",
    "crc",
    "crlf",
    "crm",
    "crs",
    "crt",
    "crud",
    "cs",
    "cse",
    "csi",
    "csm",
    "csp",
    "csrf",
    "css",
    "csv",
    "ct",
    "ctan",
    "ctcp",
    "ctfe",
    "cti",
    "ctl",
    "ctm",
    "cts",
    "ctss",
    "cua",
    "cvs",
    "dac",
    "dal",
    "dao",
    "dap",
    "darpa",
    "dat",
    "db",
    "dba",
    "dbcs",
    "dbms",
    "dcc",
    "dcca",
    "dccp",
    "dcl",
    "dcmi",
    "dcom",
    "dcs",
    "dd",
    "dde",
    "ddi",
    "ddl",
    "ddr",
    "dec",
    "des",
    "dfa",
    "dfd",
    "dfs",
    "dgd",
    "dhcp",
    "dhtml",
    "dif",
    "dimm",
    "din",
    "dip",
    "dism",
    "divx",
    "dkim",
    "dl",
    "dll",
    "dlna",
    "dlp",
    "dma",
    "dmca",
    "dmi",
    "dml",
    "dmr",
    "dmz",
    "dn",
    "dnd",
    "dns",
    "doa",
    "docsis",
    "dom",
    "dos",
    "dp",
    "dpc",
    "dpi",
    "dpmi",
    "dpms",
    "dr",
    "dram",
    "dri",
    "drm",
    "dsa",
    "dsdl",
    "dsdm",
    "dsl",
    "dslam",
    "dsn",
    "dsp",
    "dsssl",
    "dtd",
    "dte",
    "dtp",
    "dtr",
    "dvd",
    "dvi",
    "dvr",
    "dw",
    "eai",
    "eap",
    "eas",
    "ebcdic",
    "ebml",
    "ecc",
    "ecma",
    "ecn",
    "ecos",
    "ecrs",
    "eda",
    "edi",
    "edo",
    "edsac",
    "edvac",
    "eeprom",
    "eff",
    "efi",
    "efm",
    "efs",
    "ega",
    "egp",
    "eide",
    "eigrp",
    "eisa",
    "elf",
    "emacs",
    "ems",
    "eniac",
    "eod",
    "eof",
    "eol",
    "eom",
    "eos",
    "eprom",
    "erd",
    "erm",
    "erp",
    "esb",
    "escon",
    "esd",
    "esr",
    "etl",
    "etw",
    "euc",
    "eula",
    "ewmh",
    "ext",
    "fap",
    "faq",
    "fasm",
    "fbdimm",
    "fcb",
    "fcs",
    "fdc",
    "fdd",
    "fddi",
    "fdm",
    "fdma",
    "fds",
    "fec",
    "femb",
    "fet",
    "fhs",
    "ficon",
    "fifo",
    "fips",
    "fl",
    "flac",
    "flops",
    "fmc",
    "fmo",
    "foldoc",
    "fosdem",
    "fosi",
    "foss",
    "fp",
    "fpga",
    "fps",
    "fpu",
    "fqdn",
    "fru",
    "fs",
    "fsb",
    "fsf",
    "fsm",
    "ftp",
    "ftta",
    "fttc",
    "ftth",
    "fttp",
    "fud",
    "fvek",
    "fws",
    "fxp",
    "fyi",
    "gb",
    "gcc",
    "gcj",
    "gcr",
    "gdb",
    "gdi",
    "geran",
    "gfdl",
    "gif",
    "gigo",
    "gimps",
    "gis",
    "gml",
    "gnu",
    "goms",
    "gpasm",
    "gpfs",
    "gpg",
    "gpgpu",
    "gpib",
    "gpl",
    "gprs",
    "gpt",
    "gpu",
    "gsm",
    "gui",
    "guid",
    "gwt",
    "gyr",
    "hal",
    "hasp",
    "hba",
    "hci",
    "hcl",
    "hd",
    "hdd",
    "hdl",
    "hdmi",
    "hf",
    "hfs",
    "hhd",
    "hid",
    "hig",
    "hird",
    "hlasm",
    "hls",
    "hma",
    "hp",
    "hpc",
    "hpfs",
    "hsdpa",
    "hsm",
    "ht",
    "htc",
    "htm",
    "html",
    "http",
    "https",
    "htx",
    "hurd",
    "hvd",
    "iana",
    "ibm",
    "ic",
    "icann",
    "ich",
    "icmp",
    "icp",
    "ics",
    "ict",
    "id",
    "ide",
    "idf",
    "idl",
    "ids",
    "iec",
    "ieee",
    "ietf",
    "ifl",
    "igmp",
    "igrp",
    "ihv",
    "iiop",
    "iis",
    "ike",
    "il",
    "im",
    "imap",
    "ime",
    "infosec",
    "ip",
    "ipam",
    "ipc",
    "ipl",
    "ipmi",
    "ipo",
    "ipp",
    "ips",
    "iptv",
    "ipx",
    "ir",
    "irc",
    "iri",
    "irp",
    "irq",
    "isa",
    "isam",
    "isatap",
    "isc",
    "isdn",
    "iso",
    "isp",
    "ispf",
    "isr",
    "isv",
    "itil",
    "itl",
    "itu",
    "ivcr",
    "ivrs",
    "jaxb",
    "jaxp",
    "jbod",
    "jce",
    "jcl",
    "jcp",
    "jdbc",
    "jdk",
    "jds",
    "jee",
    "jes",
    "jfc",
    "jfet",
    "jfs",
    "jini",
    "jit",
    "jme",
    "jms",
    "jmx",
    "jndi",
    "jni",
    "jnz",
    "jpeg",
    "jre",
    "js",
    "jse",
    "json",
    "jsp",
    "jtag",
    "jvm",
    "kb",
    "kde",
    "km",
    "krl",
    "kvm",
    "lacp",
    "lan",
    "lb",
    "lba",
    "lcd",
    "lcos",
    "lcr",
    "ldap",
    "le",
    "led",
    "lf",
    "lfs",
    "lga",
    "lgpl",
    "lib",
    "lif",
    "lifo",
    "lilo",
    "lisp",
    "lkml",
    "lm",
    "loc",
    "lpc",
    "lpi",
    "lpt",
    "lru",
    "lsb",
    "lsi",
    "lte",
    "ltl",
    "ltr",
    "lun",
    "lv",
    "lvd",
    "lvm",
    "lzw",
    "mac",
    "manet",
    "mapi",
    "mb",
    "mbcs",
    "mbd",
    "mbr",
    "mca",
    "mcad",
    "mcas",
    "mcdba",
    "mcdst",
    "mcitp",
    "mcm",
    "mcp",
    "mcpc",
    "mcpd",
    "mcsa",
    "mcsd",
    "mcse",
    "mct",
    "mcts",
    "mda",
    "mdf",
    "mdi",
    "mf",
    "mfc",
    "mfm",
    "mgcp",
    "mib",
    "micr",
    "midi",
    "mimd",
    "mime",
    "mimo",
    "minix",
    "mips",
    "mis",
    "misd",
    "mit",
    "mmc",
    "mmds",
    "mmf",
    "mmi",
    "mmio",
    "mmorpg",
    "mmu",
    "mmx",
    "mng",
    "mom",
    "mos",
    "mosfet",
    "motd",
    "mous",
    "mov",
    "mpaa",
    "mpeg",
    "mpl",
    "mpls",
    "mpu",
    "ms",
    "msa",
    "msb",
    "msdn",
    "msi",
    "msn",
    "mt",
    "mta",
    "mtbf",
    "mtu",
    "mua",
    "mvc",
    "mvp",
    "mvs",
    "mwc",
    "mx",
    "mxf",
    "nack",
    "nak",
    "nas",
    "nasm",
    "ncp",
    "ncq",
    "ncsa",
    "ndis",
    "ndps",
    "nds",
    "nep",
    "nfa",
    "nfc",
    "nfs",
    "ngl",
    "ngscb",
    "ni",
    "nic",
    "nim",
    "nio",
    "nist",
    "nlp",
    "nls",
    "nmi",
    "nntp",
    "noc",
    "nop",
    "nos",
    "np",
    "npl",
    "nptl",
    "npu",
    "ns",
    "nsa",
    "nsi",
    "nspr",
    "nss",
    "nt",
    "ntfs",
    "ntlm",
    "ntp",
    "numa",
    "nurbs",
    "nvr",
    "nvram",
    "oat",
    "obsai",
    "odbc",
    "oem",
    "oes",
    "ofdm",
    "oftc",
    "oid",
    "olap",
    "ole",
    "oled",
    "olpc",
    "oltp",
    "omf",
    "omg",
    "omr",
    "oo",
    "ooe",
    "oom",
    "oop",
    "ootb",
    "opml",
    "orb",
    "orm",
    "os",
    "oscon",
    "osdn",
    "osi",
    "ospf",
    "oss",
    "ostg",
    "oui",
    "pap",
    "parc",
    "pata",
    "pbs",
    "pc",
    "pcb",
    "pci",
    "pcl",
    "pcm",
    "pcmcia",
    "pcre",
    "pd",
    "pda",
    "pdf",
    "pdh",
    "pdp",
    "pe",
    "perl",
    "pfa",
    "pg",
    "pga",
    "pgo",
    "pgp",
    "php",
    "pid",
    "pim",
    "pio",
    "pkcs",
    "pki",
    "plc",
    "pld",
    "plt",
    "pmm",
    "png",
    "pnrp",
    "poid",
    "pojo",
    "posix",
    "ppc",
    "ppi",
    "ppp",
    "pptp",
    "pr",
    "ps",
    "psa",
    "psm",
    "psu",
    "psvi",
    "pv",
    "pvg",
    "pvr",
    "pxe",
    "pxi",
    "qa",
    "qdr",
    "qfp",
    "qotd",
    "qsop",
    "qtam",
    "racf",
    "rad",
    "raid",
    "raii",
    "rait",
    "ram",
    "rarp",
    "ras",
    "rc",
    "rcs",
    "rd",
    "rdbms",
    "rdc",
    "rdf",
    "rdm",
    "rdos",
    "rdp",
    "rds",
    "refal",
    "rest",
    "rf",
    "rfc",
    "rfi",
    "rfid",
    "rgb",
    "rgba",
    "rhel",
    "rhl",
    "ria",
    "riaa",
    "rip",
    "rir",
    "risc",
    "rje",
    "rle",
    "rll",
    "rmi",
    "rms",
    "rom",
    "romb",
    "rpc",
    "rpg",
    "rpm",
    "rras",
    "rsa",
    "rsi",
    "rss",
    "rtai",
    "rtc",
    "rte",
    "rtems",
    "rtl",
    "rtos",
    "rtp",
    "rts",
    "rtsp",
    "rtti",
    "rwd",
    "san",
    "sas",
    "sata",
    "sax",
    "sbod",
    "sbu",
    "scada",
    "scid",
    "scm",
    "scp",
    "scpc",
    "scpi",
    "scsa",
    "scsi",
    "sctp",
    "sd",
    "sddl",
    "sdh",
    "sdi",
    "sdio",
    "sdk",
    "sdl",
    "sdn",
    "sdp",
    "sdr",
    "sdram",
    "sdsl",
    "se",
    "sec",
    "sei",
    "seo",
    "sftp",
    "sgi",
    "sgml",
    "sgr",
    "sha",
    "shdsl",
    "sigcat",
    "siggraph",
    "simd",
    "simm",
    "sip",
    "sisd",
    "siso",
    "sles",
    "sli",
    "slm",
    "sloc",
    "sma",
    "smb",
    "smbios",
    "sme",
    "smf",
    "smil",
    "smp",
    "smps",
    "sms",
    "smt",
    "smtp",
    "sna",
    "snmp",
    "sntp",
    "soa",
    "soe",
    "soho",
    "soi",
    "sopa",
    "sp",
    "spa",
    "sparc",
    "spf",
    "spi",
    "spm",
    "spmd",
    "sql",
    "sram",
    "ssa",
    "ssd",
    "ssdp",
    "sse",
    "ssh",
    "ssi",
    "ssid",
    "ssl",
    "ssp",
    "ssse",
    "sssp",
    "sstp",
    "sus",
    "suse",
    "svc",
    "svd",
    "svg",
    "svga",
    "swf",
    "swt",
    "tao",
    "tapi",
    "tasm",
    "tb",
    "tcp",
    "tcu",
    "tdma",
    "tft",
    "tftp",
    "ti",
    "tla",
    "tld",
    "tls",
    "tlv",
    "tnc",
    "tpf",
    "tpm",
    "troff",
    "tron",
    "trsdos",
    "tso",
    "tsp",
    "tsr",
    "tta",
    "ttf",
    "ttl",
    "tts",
    "tty",
    "tucows",
    "twain",
    "uaag",
    "uac",
    "uart",
    "uat",
    "ucs",
    "uddi",
    "udma",
    "udp",
    "uefi",
    "uhf",
    "ui",
    "ul",
    "ula",
    "uma",
    "umb",
    "uml",
    "umpc",
    "umts",
    "unc",
    "univac",
    "ups",
    "uri",
    "url",
    "usb",
    "usr",
    "utc",
    "utf",
    "utp",
    "utran",
    "uucp",
    "uuid",
    "uun",
    "uvc",
    "uwp",
    "ux",
    "vax",
    "vb",
    "vba",
    "vbs",
    "vcpi",
    "vdm",
    "vdsl",
    "vesa",
    "vfat",
    "vfs",
    "vg",
    "vga",
    "vhf",
    "vlan",
    "vlb",
    "vlf",
    "vliw",
    "vlsi",
    "vlsm",
    "vm",
    "vmm",
    "vnc",
    "vod",
    "vpn",
    "vpu",
    "vr",
    "vram",
    "vrml",
    "vsam",
    "vsat",
    "vt",
    "vtam",
    "vtl",
    "wafs",
    "wai",
    "wais",
    "wan",
    "wap",
    "wasm",
    "wbem",
    "wcag",
    "wcf",
    "wdm",
    "wep",
    "wfi",
    "wins",
    "wlan",
    "wma",
    "wmi",
    "wmv",
    "wns",
    "wol",
    "wor",
    "wora",
    "wpa",
    "wpad",
    "wpan",
    "wpf",
    "wsdl",
    "wsfl",
    "wusb",
    "wwan",
    "wwdc",
    "wwid",
    "wwn",
    "www",
    "wysiwyg",
    "wzc",
    "xag",
    "xaml",
    "xcbl",
    "xdm",
    "xdmcp",
    "xhtml",
    "xilp",
    "xml",
    "xmms",
    "xmpp",
    "xms",
    "xns",
    "xp",
    "xpcom",
    "xpi",
    "xpidl",
    "xps",
    "xsd",
    "xsl",
    "xslt",
    "xss",
    "xtf",
    "xul",
    "xvga",
    "yaaf",
    "yacc",
    "yaml",
    "zcav",
    "zcs",
    "zif",
    "zifs",
    "zisc",
    "zma",
    "zoi",
    "zope",
    "zpl"
];

export enum AcronymStyleOptions {
    Pascal = "pascal",
    Camel = "camel",
    Original = "original",
    Lower = "lowerCase"
}

export const acronymOption = function (defaultOption: AcronymStyleOptions) {
    return new EnumOption(
        "acronym-style",
        "Acronym naming style",
        [
            [AcronymStyleOptions.Original, AcronymStyleOptions.Original],
            [AcronymStyleOptions.Pascal, AcronymStyleOptions.Pascal],
            [AcronymStyleOptions.Camel, AcronymStyleOptions.Camel],
            [AcronymStyleOptions.Lower, AcronymStyleOptions.Lower]
        ],
        defaultOption,
        "secondary"
    );
};

export function acronymStyle(style: AcronymStyleOptions): (s: string) => string {
    const options: { [key: string]: (s: string) => string } = {
        [AcronymStyleOptions.Pascal]: allUpperWordStyle,
        [AcronymStyleOptions.Camel]: firstUpperWordStyle,
        [AcronymStyleOptions.Original]: originalWord,
        [AcronymStyleOptions.Lower]: allLowerWordStyle
    };

    return options[style];
}
